﻿// calculator.h : Include file for standard system include files,
// or project specific include files.

#ifndef __CALCULATOR_H__
#define __CALCULATOR_H__

#include <iostream>
#include <string>      // 用于字符串处理 (std::string)
#include <cctype>      // 用于字符类型检查 (isdigit, isspace)
#include <stdexcept>   // 用于标准异常类 (std::runtime_error)
#include <iomanip>     // 用于格式化输出 (std::fixed, std::setprecision)

// 计算器
// https://mp.weixin.qq.com/s/Gnj6ig2qTAnI51Eg2NGEcA

// 计算函数(递归下降解析器的基石)
// 解析表达式：加法和减法
// 语法规则：expression = term { ("+" | "-") term }
double parseExpression(std::string_view input, size_t &pos);

// 解析项：乘法，除法和取模运算
// 语法规则：term = factor { ("*" | "/" | "%") factor }
double parseTerm(std::string_view input, size_t &pos);

// 解析因子：数字或括号内的表达式
// 语法规则：factor = number | "(" expression ")"
double parseFactor(std::string_view input, size_t &pos);

// 解析表达式：幂运算 (^)
double parsePower(std::string_view input, size_t &pos);

// 辅助函数(处理空白和数字)
void skipWhitespace(std::string_view input, size_t &pos);
double parseNumber(std::string_view input, size_t &pos);

// 入口函数
double calculate(std::string_view expression);

#endif // !__CALCULATOR_H__
